package bots;


import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Vector;

import javax.jdo.PersistenceManager;

import model.KategorijaPovlastice;
import model.Mesto;
import model.Povlastica;
import model.Prevoznik;
import model.PutnaDuz;
import model.User;
import model.Util;
import model.VrstaPrevoza;

import org.htmlparser.Parser;
import org.htmlparser.Tag;
import org.htmlparser.filters.HasAttributeFilter;
import org.htmlparser.filters.StringFilter;
import org.htmlparser.tags.OptionTag;
import org.htmlparser.tags.SelectTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.restlet.data.Reference;

import app.PMF;

import com.google.appengine.api.datastore.Key;


public class GSPNS implements BotI{

	@Override
	public List<PutnaDuz> procitajPodatke() {

		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		Vector<PutnaDuz> rezultat = new Vector<PutnaDuz>();
		VrstaPrevoza vp = Util.getEnityByFieldEqualsValue(VrstaPrevoza.class,"naziv","Bus");
		System.out.println("Vrsta Prevoza: " + vp);

		SimpleDateFormat sdfDate = new SimpleDateFormat("yyyy-MM-dd");
		SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm");

		try {
			
			//UCITAVAMO POLASKE IZ NOVOG SADA

			System.out.println("\n\tUcitavamo pocetnu stranicu...");
			Parser parser = new Parser("http://gspns.rs/redvoznje.php?rv=rvm");
			System.out.println("\n\tStranica ucitana!");
			//parsiramo stranicu
			NodeList nl = parser.parse(new HasAttributeFilter("name", "linija[]"));
			Tag tag = (Tag) nl.elementAt(0);

			//izvlacimo gradove iz stranice
			SelectTag slGradovi = (SelectTag) tag;			
			//System.out.println("Ukupno gradova: "+slGradovi.getChildCount());			
			OptionTag otGradovi[] = slGradovi.getOptionTags();
			
			for (int i = 0; i < otGradovi.length; i++) {
				String grad = otGradovi[i].getValue();

				//vadimo danasnji datum
				String currentDate = sdfDate.format(Calendar.getInstance().getTime());

				//ucitavamo stranizu za polaske
				System.out.println("\n\tUcitavamo stranicu za grad: " + grad + "...");
				String kodovanGrad = Reference.encode(grad);
				System.out.println("Coded: " + kodovanGrad);
				
				parser = new Parser("http://gspns.rs/redvoznje.php?zadan="+currentDate+"&pd=p&rv=rvm&linija%5B%5D=" + kodovanGrad);
				System.out.println("\n\tStranica ucitana!");

				//pronalazimo tabalu preko vrednosti, posto nema NAME
				nl = parser.parse(new StringFilter("Polasci za "));
				tag = (Tag) nl.elementAt(0).getParent();

				//pozivamo 2 puta, da bi smo dosli do tabele
				tag = (Tag) tag.getParent();
				TableTag ttTabela = (TableTag) tag.getParent();

				//prolazimo kroz redove pocevsi od drugog, jer oni sadrze podatke
				for (int j = 2; j < ttTabela.getRowCount(); j++) {
					TableRow trRed = ttTabela.getRow(j);
					//ttTabela.get
					TableColumn[] tcKolone = trRed.getColumns();

					String vremePolaska = tcKolone[0].getChild(0).toPlainTextString(); 
					//String kilometraza = tcKolone[1].getChild(0).toPlainTextString(); ;
					String trajanje = tcKolone[2].getChild(0).toPlainTextString(); ;
					String prevoznik = tcKolone[3].getChild(0).toPlainTextString(); ;
					//String linija = tcKolone[4].getChild(0).toPlainTextString(); ;
					//String peron = tcKolone[5].getChild(0).toPlainTextString(); ;
					String cena = tcKolone[6].getChild(0).toPlainTextString(); ;

					Prevoznik pPrev = Util.getCarrierFromName(prevoznik);
					if(pPrev != null){
						ArrayList<Key> povlastice = new ArrayList<Key>();
						Mesto mMestoOd = Util.getMestoFromName("NOVI SAD");
						Mesto mMestoDo = Util.getMestoFromName(grad);
						
						//ako je bot naleteo na mesto koje ne postoji u bazi javljamo gresku
						if(mMestoOd == null || mMestoDo == null){
							System.out.println("Doslo je do greske, nepoznato mesto!");
							continue;
						}
						
						PutnaDuz pd = new PutnaDuz(Double.parseDouble(cena), sdfTime.parse(vremePolaska), sdfTime.parse(trajanje), 
								povlastice, mMestoOd.getSifra(), mMestoDo.getSifra(), pPrev.getSifra()); 
						rezultat.add(pd);
						pm.makePersistent(pd);
						System.out.println(pd);
					//nemamo prevoznika, odlucujemo se da ga cuvamo u bazu
					}else{
						//kreiramo prevoznika i snimimo ga u bazu
						pPrev = new Prevoznik(prevoznik, vp.getSifra());
						pm.makePersistent(pPrev);
						//ostatk koda isto kao u IF grani
						ArrayList<Key> povlastice = new ArrayList<Key>();
						Mesto mMestoOd = Util.getMestoFromName("NOVI SAD");
						Mesto mMestoDo = Util.getMestoFromName(grad);
						
						//ako je bot naleteo na mesto koje ne postoji u bazi javljamo gresku
						if(mMestoOd == null || mMestoDo == null){
							System.out.println("Doslo je do greske, nepoznato mesto!");
							continue;
						}
						
						System.out.println("Cena: "+cena + " polazak: " + vremePolaska + " , trajanje: " + trajanje);
						PutnaDuz pd = new PutnaDuz(Double.parseDouble(cena), sdfTime.parse(vremePolaska), sdfTime.parse(trajanje), 
								povlastice, mMestoOd.getSifra(), mMestoDo.getSifra(), pPrev.getSifra());
						pm.makePersistent(pd);
						rezultat.add(pd);
						System.out.println(pd);
					}
				}
			}
			
			//UCITANI POLASCI IZ NOVOG SADA

			//**********************************
			
			//UCITAVAMO DOLASKE IZ NOVOG SADA


		} catch (ParserException e) {
			e.printStackTrace();
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (ParseException e) {
			e.printStackTrace();
		}
		pm.close();
		
		return rezultat;
	}

	public static PutnaDuz napraviPutnudDuz(){
		
		PersistenceManager pm = PMF.get().getPersistenceManager();
		
		User k3 = new User("zzz", "111");
		pm.makePersistent(k3);
		
		VrstaPrevoza voz = new VrstaPrevoza("Voz");
		pm.makePersistent(voz);
		
		Prevoznik zel = new Prevoznik("ZelezniceSrbije", new ArrayList<String>(), "Ulica*** br 2",
				"b@c.com", "011333", voz.getSifra(), k3.getSifra());
		pm.makePersistent(zel);

		KategorijaPovlastice kat1 = new KategorijaPovlastice("Student");
		pm.makePersistent(kat1);

		Povlastica povl1 = new Povlastica("Stud30", Povlastica.PROCENAT,
				30, kat1.getSifra(), zel.getSifra());
		pm.makePersistent(povl1);
		ArrayList<Key> povlastice = new ArrayList<Key>();
		
		povlastice.add(povl1.getSifra());
		
		Calendar polazak = Calendar.getInstance();
		polazak.set(2011, 2, 20, 15, 0);
		// polazak.getTime().getHours()
		Calendar dolazak = Calendar.getInstance();
		dolazak.set(2011, 2, 20, 16, 0);
		
		PutnaDuz pd1 = new PutnaDuz(800, polazak.getTime(),
				dolazak.getTime(), povlastice, Util.getMestoFromName("SUBOTICA")
						.getSifra(), Util.getMestoFromName("ZRENJANIN")
						.getSifra(), zel.getSifra());
		pm.makePersistent(pd1);
		
		pm.close();
		return pd1;
	}
}